package pl.edu.project.model;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;

/**
 * Klasa reprezentuj�ca g��wny kontener zdarze� w aplikacji. Przechowuje
 * informacje dotycz�ce poszczeg�lnych zdarze� zdefiniowanych w klasie Event.
 * Wszystkie dane przechowywane s� w jednej tabeli list.
 */
public class EventsList {
    /**
     * Pole przechowuj�ce informacj� o aktualnym identydikatorze zdarzenia
     */
    public int currentID;

    /**
     * Pole przechowuj�ce list� zdarze�
     */
    private ArrayList<Event> list = new ArrayList<Event>();

    /**
     * Metoda dodaj�ca zdarzenie do listy zdarze�
     * 
     * @param e
     *            zdarzenie
     */
    public void addEvent(Event e) {
	list.add(e);
	currentID++;
    }

    /**
     * Metoda sprawdzaj�ca ustawienie alarmu d�wi�kowego
     * 
     * @param c
     *            d obiekt klasy Calendar, zawieraj�cy dat� zdarzenia
     * @return zdarzenie
     */
    public Event checkAlarm(Calendar c) {
	Event e;
	for (int i = 0; i < list.size(); i++) {
	    e = list.get(i);
	    if (e.isAlarm()) {
		c.add(Calendar.MINUTE, e.getAlarmMinutesBefore());
		if (e.compareTo(c) <= 0) {
		    list.get(i).setAlarm(false);
		    return e;
		}
	    }
	}
	return null;
    }

    /**
     * Metoda usuwaj�ca zdarzenie
     * 
     * @param id
     *            identyfikator zdarzenia
     */
    public void delEvent(int id) {
	for (int i = 0; i < list.size(); i++) {
	    if (list.get(i).getId() == id)
		list.remove(i);
	}
    }

    /**
     * Metoda filtruj�ca zdarzenia, usuwaj�ca zdarzenia starsze ni� ustalona
     * data
     * 
     * @param e
     *            zdarzenie
     */
    public void filterEvents(Event e) {
	for (int i = list.size() - 1; i >= 0; i--)
	    if (list.get(i).compareTo(e) < 0)
		list.remove(i);
    }

    /**
     * Metoda zwracaj�ca identyfikator aktualnego zdarzenia
     * 
     * @return - identyfikator aktualnego zdarzenia
     */
    public int getCurrentID() {
	return currentID;
    }

    /**
     * Metoda zwracaj�ca zdarzenie
     * 
     * @param d
     *            obiekt klasy Calendar, zawieraj�cy dat� zdarzenia
     * @param eventNumber
     *            numer zdarzenia
     * @return - zdarzenie
     */
    public Event getEvent(Calendar d, int eventNumber) {
	Event temp = null;
	for (int i = 0; i < list.size(); i++)
	    if (list.get(i).getYear() == d.get(Calendar.YEAR))
		if (list.get(i).getMonth() == d.get(Calendar.MONTH))
		    if (list.get(i).getDay() == d.get(Calendar.DAY_OF_MONTH)) {
			if (eventNumber == 1) {
			    temp = list.get(i);
			    break;
			} else
			    eventNumber--;
		    }
	return temp;
    }

    /**
     * Metoda zwracaj�ca zdarzenie
     * 
     * @param id
     *            identyfikator zdarzenia
     * @return zdarzenie
     */
    public Event getEvent(int id) {
	Event temp = null;
	for (int i = 0; i < list.size(); i++)
	    if (list.get(i).getId() == id) {
		temp = list.get(i);
		break;
	    }
	return temp;
    }

    /**
     * Metoda zwracaj�ca ilo�� zdarze�
     * 
     * @param d
     *            obiekt klasy Calendar, zawieraj�cy dat� zdarzenia
     * @return - ilo�� zdarze�
     */
    public int getEventsAmount(Calendar d) {
	int amount = 0;
	for (int i = 0; i < list.size(); i++)
	    if (list.get(i).getYear() == d.get(Calendar.YEAR))
		if (list.get(i).getMonth() == d.get(Calendar.MONTH))
		    if (list.get(i).getDay() == d.get(Calendar.DAY_OF_MONTH))
			amount++;
	return amount;
    }

    /**
     * Metoda importuj�ca list� zdarze�
     * 
     * @param nowe
     *            lista zdarze�
     */
    public void importList(EventsList nowe) {
	this.currentID = nowe.currentID;
	this.list = nowe.list;

    }

    /**
     * Metoda ustawiaj�ca identyfikator aktualnego zdarzenia
     * 
     * @param currentID
     *            identyfikator aktualnego zdarzenia
     */
    public void setCurrentID(int currentID) {
	this.currentID = currentID;
    }

    /**
     * Metoda sortuj�ca list� zdarze�
     */
    public void sort() {
	Collections.sort(list);
    }

}
